package koby99;

import java.util.Scanner;

public class J32_Exception {

	/**
	 *  예외처리 exception
	 *  오류 처리는 프로그래밍 언어의 중요한 기능임
	 *  좋은 오류 처리 메커니즘은 프로그래머가 
	 *  보다 쉽게 강력한 프로그램을 작성하고
	 *  몰래 섞여 들어오는 버그를 방지할 수 있음
	 *  
	 *  일부 언어에서는 발생가능한 모든 오류를 미리
	 *  감지하기 위해 강제로 다중 if문을 사용
	 *  이런 경우 코드가 지나치게 복잡해 짐
	 *  
	 *  자바에서는 try문을 사용하여 
	 *  보다 쉽게 오류를 감지하고 처리
	 *  
	 *  오류error vs 예외exception
	 * 	프로그램의 정상실행을 방해하는 요소
	 * 	오류 : 프로그램의 잘못된 코드나
	 * 		 CPU 연산의 잘못된 동작으로 발생
	 * 		  컴파일 오류, 실행시간 오류로  다시 분류
	 *  >컴파일 오류 : 잘못된 문법으로 인해 발생된 오류
	 *  >실행시간 오류 : 잘못된 코드사용이나 
	 *   		        하드웨어의 오동작으로 인한 오류
	 *  하드웨어적으로 발생하는 오류를 제외하고
	 *  모든 오류는 개발자가 적절히 수정가능
	 *  
	 *  예외 : 일반적인 프로그램 실행 순서를 벗어나는 것
	 *  프로그램 상에서 코드에 의해 예외를 바로 잡을 수 있음
	 *  즉, 위에서 언급한 오류들을 코드에 의해 수숩할 수 있는
	 *  미약한 오류라는 의미도 있음
	 *  
	 *  실행시간 오류가 생길 것 같은 코드는
	 *  일반적으로 try - catch - finally 문으로 격리 가능
	 *  오류가 발생하면 try 블록의 처리를 중단하고
	 *  catch 블록으로 제어가 넘어감
	 */
	
	
	public static void main(String[] args) {
		
		// 오류가 발생하는 경우 - 코드 무시
		System.out.println("이글이 보이나요옷!");
//		System.out.println(100/0); 무시
		System.out.println("이구리 보이놔아?");
		// 오류가 발생하는 경우 - 코드 무시
		System.out.println("이글이 보이나요옷!");
		try{
		System.out.println(100/0);
		}catch(Exception e){
//			System.out.println("0으로 나눌 수 없어요.!!!!1");
//			e.printStackTrace(); 일반적으로 사용함(오류위치, 이유가 표시)
			System.out.println(e.getMessage());
		}
		System.out.println("이구리 보이놔아?");
		// 오류가 발생하는 경우 - 코드 무시
//		System.out.println("이글이 보이나요옷!");
//		System.out.println(100/0);
//		System.out.println("이구리 보이놔아?");
		
		// 1-10 사이 정수를 받아 출력하는 프로그램
		Scanner sd = new Scanner(System.in);
		
		
//		while(true){
//			int num = 0;
//			System.out.println("1-10사이 정수를 입력하세요.");
//		try{sd=new Scanner(System.in);
//			num = sd.nextInt();
//			System.out.println("입력하신 정수는 "+num);}
//		catch(Exception e){
//			System.err.println("다시 입력해요!");
//			// 이전에 입력한 내용이 문자인 경우
//			// Scanner 내부 저장소(버퍼)에 남아있기 때문에
//			// 계속 무한반복으로 위 문장이 출력됨
//			// Scanner 를 다시 초기화해야만 문제가 해결
//		 }
		//예외 처리 1
		try{
		int[] name = new int[3];
		name[0] = 1;
		name[1] = 2;
		name[2] = 3;
		name[3] = 4;}
		catch(Exception e){System.err.println("하나 더있자나 -_-");}
		
		//예외 처리 2
		int result = 0;
		try{
		for(int i = 10;i>=0 ; --i){
			result += (int)Math.random()*10/i;
		System.out.println(result);}}
		catch (Exception e) {
			System.err.println("안딤");
		}
		
		//다중 예외 처리
//		try{
//		System.out.println( 100/0 );
//		char[] grade = new char[3];
//		grade[3] = 'a';
//		}catch (Exception e) {
//			System.out.println("0으로 나누지못함");
//		}
		try{
//			System.out.println( 100/0 );
			char[] grade = new char[3];
			grade[3] = 'a';
			}catch (ArithmeticException ae) { //산수식 오류
				System.err.println("0으로 나누지못함");
			}catch (ArrayIndexOutOfBoundsException aiobe){ //배열 오류
				System.err.println("배열의 범위를 벗어났습니다");
			}catch (Exception e){
				System.out.println("알 수 없는 오류 발생");
			}
		// 코드에서 발생할 수 있는 예외가
		// 하나 이상인 경우 다중 catch 문으로
		// 각각의 예외에 따라 독자적인 오류처리를 할 수 있음
		
	  
	}
		
}
	
	
		
		
	


